package com.kamistoat.meimeimall.common.valid;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.HashSet;
import java.util.Set;

/**
 * 使用@Constraint()为@IntValueList自定义注解指定的处理器类
 * 需要继承接口ConstraintValidator，接口的两个输入类分别是 <这个实现类映射哪一个自定义注解，以及那个注解将会作用在哪一类数据类型上>
 *  显然我们这里映射的注解就是@IntValueList，作用数据类型就是Integer
 * 然后IDEA自动根据<IntValueList,Integer>生成两个方法，一个是初始化方法，以ListValue作为输入参数，一个是判断方法，以Integer作为输入参数
 */
public class IntValueListConstraintValidation implements ConstraintValidator<IntValueList, Integer> {

    private Set<Integer> set = new HashSet<>();

    // 初始化方法
    // 输入值就是映射的自定义注解 @IntValueList
    // 这个方法会将使用注解时，在注解内设置的字段参数获取进来，也就是限定值列表vals={1,2}
    @Override
    public void initialize(IntValueList constraintAnnotation) {
        // 获取自定义注解的vals字段的值，
        int[] vals = constraintAnnotation.vals();
        if (vals.length != 0) {
            for (int val : vals) {
                set.add(val);
            }
        }
    }

    // 判断是否校验成功，返回值必须是true或者false
    // 第一个输入参数就是这个自定义注解作用的字段，传来的需要校验的值，比如用户输入的1
    // 第二个输入参数是上下文环境信息，暂时不知道应该怎么使用
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        // 直接判断要校验的值，是否位于规定的值当中
        return set.contains(value);
    }
}
